using UnityEngine;

namespace GraphEditor.Runtime
{
    /// <summary>
    /// 整个图的蓝图类。是我们的核心类型。也是这一切数据的桥梁。
    /// </summary>
    [CreateAssetMenu]
    public class GraphCanvas : ScriptableObject
    {
        /// <summary>
        /// 运行时逻辑类数据的序列化文本。用户可以自由操作，无论是拿取去反序列化还是写入自己的字符串，这个数据我们本身不关心。是给用户使用的。也是我们整套编辑器最终烘焙后的数据。
        /// </summary>
        public string logicData;

#if UNITY_EDITOR
        /// <summary>
        /// 运行时逻辑类数据模型的完整类型名。用来实际定位用的逻辑图类，相当于是行为树本身或者是状态机本身的基本类型。
        /// 用UNITY_EDITOR宏包裹，避免打到包里。
        /// </summary>
        [SerializeField]
        private string _logicType;
        /// <summary>
        /// 图的逻辑类数据。在烘焙的时候，会将这个数据序列化成字符串，存到runtimeData中。
        /// 用SerializeReference是方便处理多态序列化的情况。
        /// 用UNITY_EDITOR包裹，避免打到包里。
        /// </summary>
        [SerializeReference]
        private IElement _logicInstance = null;
        /// <summary>
        /// 图的视图类数据模型。
        /// 用SerializeReference是方便处理多态序列化的情况。
        /// 用UNITY_EDITOR包裹，避免打到包里。
        /// </summary>
        [SerializeReference]
        private GraphData _graphData = null;

        internal string LogicType
        {
            get { return _logicType; }
            set { _logicType = value; }
        }

        internal IElement LogicInstance
        {
            get { return _logicInstance; }
            set { _logicInstance = value; }
        }

        internal GraphData GraphData
        {
            get { return _graphData; }
            set { _graphData = value; }
        }
#endif
    }
}
